#include<iostream>
#include<functional>
#include<string>

using namespace std;

void hello(string str)
{
    cout << str << endl;
}

int sum(int a,int b)
{
    return a + b;
}

template<typename Fty>
class myfunction{
};

/*
template<typename R,typename A1>
class myfunction<R(A1)>
{
    public:
        //函数返回的指针参数类型
        using PFUNC = R (*)(A1);
        myfunction(PFUNC pfunc) : _pfunc(pfunc){};
        R operator()(A1 arg){
            return _pfunc(arg);
        }
    private:
    PFUNC _pfunc;
};

template <typename R, typename A1,typename A2>
class myfunction<R(A1,A2)>
{
public:
    // 函数返回的指针参数类型
    using PFUNC = R (*)(A1,A2);
    myfunction(PFUNC pfunc) : _pfunc(pfunc){};
    R operator()(A1 arg1,A2 arg2)
    {
            return _pfunc(arg1,arg2);
    }

private:
    PFUNC _pfunc;
};
*/
// ...表示可变参数类型个数，和上面两个类的功能是一样的
template <typename R, typename... A>
class myfunction<R(A...)>
{
public:
    // 函数返回的指针参数类型
    using PFUNC = R (*)(A...);
    myfunction(PFUNC pfunc) : _pfunc(pfunc){};
    R operator()(A... arg)
    {
            return _pfunc(arg...);
    }

private:
    PFUNC _pfunc;
};

int main(){
    //就是构造函数重命名了hello函数
    myfunction<void(string)> func1(hello);
    func1("hello1");

    myfunction<int(int, int)> func2(sum);
    cout << func2(2, 3) << endl;

    return 0;
}